Java 21 的到来

2023 年 9 月 19 日 | 13 分钟阅读
萨拉特·钱德
Java SE 产品管理总监

­在 Twitter 上关注JavaOpenJDK

Oracle 很自豪地宣布 JDK 21 全面上市。此版本是按照六个月的发布节奏按时交付的第 12 个功能版本由于预期改进源源不断,这种程度的可预测性使开发人员能够轻松管理创新的采用。

Java 提高性能、稳定性和安全性的能力使其继续成为世界上最流行的编程语言。

JDK 21 现已推出!

Oracle 现在为开发人员、最终用户和企业提供 JDK 21 。

Oracle 将为 Java 21 提供至少八年的长期支持。延长的支持期使组织能够灵活地以最少的维护使应用程序在生产中保持更长时间,并最终按照自己的条件进行迁移。根据客户反馈和 Java 生态系统中的使用情况,Oracle 还宣布对 Java 11 的长期支持至少延长至 2032 年 1 月,Oracle 还将提供至少八年的支持和更新。

Java 21,一起

与之前的版本一样,Java 21 庆祝了 OpenJDK 社区中许多个人和组织的贡献 - 我们一起构建 Java!

JDK 21 修复率

JDK 版本随时间的变化率多年来基本保持不变,但在六个月的节奏下,生产就绪的功能和改进的交付速度急剧加快。

我们不像过去的主要版本那样每隔几年进行数以万计的修复并提供近百个 JEP(JDK 增强提案),而是按照更易于管理、可预测的六个月计划在更精简的功能版本中提供增强功能。这些变化范围从重要的新功能到日常维护、错误修复和文档改进的小增强。每个更改都在JDK Bug 系统中的单个问题的单个提交中表示。

在 GA 时,Java 11 到 Java 21 中标记为已修复的24,196 个JIRA 问题中,有 17,288 个是由 Oracle 工作人员完成的,而 6,908 个是由个人开发人员和为其他组织工作的开发人员贡献的。仔细研究这些问题并整理受让人的组织数据,可以得出以下赞助 Java 贡献开发的组织图表:

在 Java 21 中,在标记为已修复的 2,585 个 JIRA 问题中,有1,868 个 由 Oracle 完成,而717 个由 Java 社区的其他成员贡献。

Oracle 衷心感谢亚马逊、ARM、Azul、谷歌、华为、IBM、英特尔、ISCAS、红帽、Rivos、SAP 和腾讯等组织的开发人员做出的显着贡献。我们也很高兴看到 Bellsoft 和 Loongson 等小型组织以及独立开发人员的贡献,他们总共贡献了 Java 21 中 8% 的修复。

此外,通过OpenJDK 质量推广计划,我们要感谢以下 FOSS 项目,它们在测试 Java 21 早期访问版本方面提供了出色的反馈,以帮助提高发行版的质量:

  • 阿帕奇共享区
  • 阿帕奇动物园管理员
  • 断言J
  • BNYM 代码 Katas
  • JUnit5
  • 空手道
  • MyBatis

Java 21 中的新功能

除了数千个性能、稳定性和安全更新之外,Java 21 还提供了数十个新功能和增强功能,其中 15 个增强功能的重要性足以保证他们自己的JDK 增强提案 - JEP ,涵盖 6 个预览功能和 1 个孵化器功能。

JEP 预览功能是 Java SE 平台的完全指定和完全实现的语言或 VM 功能;但又是无常的。它们在 JDK 功能版本中提供,以便开发人员根据实际使用情况提供反馈,然后再在未来版本中永久保留。这也为工具供应商提供了在最终确定为 Java SE 标准之前致力于支持功能的机会。

JEP 孵化器模块允许将非最终 API 和非最终工具交给开发人员和用户,以收集反馈,最终提高 Java 平台的质量。

随 Java 21 提供的 15 个 JEP 分为六类,分别对应关键的长期 Java 技术项目和硬件支持。

琥珀计划

JEP 430:字符串模板(预览)

  • JEP 目标:
    • 通过轻松表达包含运行时计算值的字符串,简化了 Java 程序的编写。
    • 增强混合文本和表达式的表达式的可读性,无论文本适合单个源行(如字符串文字)还是跨越多个源行(如文本块)。
    • 通过支持模板及其嵌入表达式的值的验证和转换,提高 Java 程序的安全性,这些程序从用户提供的值组成字符串并将它们传递到其他系统(例如,构建数据库查询)。
    • 通过允许 Java 库定义字符串模板中使用的格式化语法来保留灵活性。
    • 简化了接受非 Java 语言(例如 SQL、XML 和 JSON)编写的字符串的 API 的使用。
    • 允许创建根据文字文本和嵌入表达式计算的非字符串值,而无需通过中间字符串表示形式进行传输。
  • 价值:
    • 遵循 Amber 项目的目标,字符串模板旨在使 Java 编程语言更具可读性、可写性和可维护性。

JEP 440:记录模式

  • JEP 目标:
    • 通过扩展模式匹配来解构类实例,从而增强 Java 编程语言,record从而实现更复杂的数据查询。
    • 添加嵌套模式,支持更多可组合的数据查询。
  • 相关:
    • [JDK 19] JEP 405:记录模式(预览版)
    • [JDK 20] JEP 432:记录模式(第二预览)
  • 价值:
    • 通过扩展模式匹配来表达更复杂、可组合的数据查询,使 Java 编程语言更加高效。

JEP 441:开关的模式匹配

  • JEP 目标:
    • 通过允许模式出现在 case 标签中,扩展了 switch 表达式和语句的表现力和适用性。
  • 允许在需要时放松切换的历史零敌意。
    • 通过要求模式 switch 语句覆盖所有可能的输入值来提高 switch 语句的安全性。
    • 确保所有现有的 switch 表达式和语句继续编译而不进行任何更改并以相同的语义执行。
  • 相关:
    • [JDK 17] JEP 406:交换机的模式匹配(预览版)
    • [JDK 18] JEP 420:switch 的模式匹配(第二次预览
    • [JDK 19] JEP 427:switch 的模式匹配(第三次预览
    • [JDK 20] JEP 433:switch 的模式匹配(第 4预览版)
  • 价值:
    • 通过使其更加语义化来提高 Java 编程语言的生产力,以便可以简洁、安全地表达复杂的面向数据的查询。

JEP 443:未命名模式和变量(预览)

  • JEP 目标:
    • 使用未命名模式和未命名变量(可以初始化但不能使用)增强 Java 语言,未命名模式可以匹配记录组件而不说明组件的名称或类型。两者都由下划线字符 表示_
  • 价值:
    • 通过消除不必要的嵌套模式来提高记录模式的可读性。
    • 通过识别必须声明(例如,在catch子句中)但不会使用的变量,提高所有代码的可维护性。

JEP 445:未命名类和实例主要方法(预览)

  • JEP 目标:
    • 为 Java 提供了一个平滑的入门通道,以便教育工作者可以循序渐进地介绍编程概念。
    • 帮助学生以简洁的方式编写基本程序,并随着他们的技能增长而优雅地扩展他们的代码。
    • 减少编写简单程序(例如脚本和命令行实用程序)的仪式。
    • 不介绍单独的 Java 初学者方言。
    • 不引入单独的初学者工具链;学生程序应该使用与编译和运行任何 Java 程序相同的工具来编译和运行。
  • 价值:
    • 通过减少样板文件和仪式来发展 Java 语言,以便学生可以编写他们的第一个程序,而无需了解为大型程序设计的语言功能。

织机计划

JEP 444:虚拟线程

  • JEP 目标:
    • 使以简单的每个请求线程风格编写的服务器应用程序能够以接近最佳的硬件利用率进行扩展。
    • 使使用 java.lang.Thread API 的现有代码能够以最小的更改采用虚拟线程。
    • 使用现有的 JDK 工具可以轻松地对虚拟线程进行故障排除、调试和分析。
  • 涉及到:
    • [JDK 20] JEP 436:虚拟线程(第二预览)
    • [JDK 19] JEP 425:虚拟线程(预览版)
  • 价值:
    • 通过引入虚拟线程,提高应用程序开发效率,例如针对云环境的应用程序,虚拟线程是轻量级线程,可大大减少编写、维护和观察高吞吐量并发应用程序的工作量。

JEP 446:范围值(预览版)

  • JEP 目标:
    • 允许在线程内和线程间共享不可变数据。
  • 相关:
    • [JDK 20] JEP 429:范围值(孵化器)
  • 价值:
    • 易于使用——提供一种编程模型来在线程内和子线程之间共享数据,从而简化数据流的推理。
    • 可理解性——使共享数据的生命周期从代码的语法结构中可见。
    • 鲁棒性——确保调用者共享的数据只能由合法的被调用者检索。
    • 性能——将共享数据视为不可变,以便允许大量线程共享,并实现运行时优化。

JEP 453:结构化并发(预览版)

  • JEP 目标:
    • 通过引入结构化并发 API 来简化并发编程。
    • 提倡一种并发编程风格,可以消除因取消和关闭而产生的常见风险,例如线程泄漏和取消延迟。
    • 提高并发代码的可观察性。
  • 相关:
    • [JDK 19] JEP 428:结构化并发(孵化器)
    • [JDK 20] JEP 437:结构化并发(第二个孵化器)
  • 价值:
    • 通过引入结构化并发 API 来简化并发编程。它简化了错误处理和取消、提高了可靠性并增强了可观察性。

巴拿马计划

JEP 442:外部函数和内存 API(第三预览)

  • JEP 目标:
    • 引入了一个 API,Java 程序可以通过该 API 与 Java 运行时之外的代码和数据进行互操作。通过有效地调用外部函数(即 JVM 外部的代码),并通过安全地访问外部内存(即不由 JVM 管理的内存),API 使 Java 程序能够调用本机库并处理本机数据,而不会造成脆弱性和危险。 JNI。这是一个预览 API。
  • 相关:
    • [JDK 19] JEP 424:外部函数和内存 API(预览)
    • [JDK 20] JEP 434:外部函数和内存 API(第二预览)
  • 价值:
    • 易于使用—用卓越的纯 Java 开发模型替换 Java 本机接口 ( JNI )。
    • 性能— 提供与 JNI 和sun.misc.Unsafe.
    • 通用性- 提供在不同类型的外部内存(例如,本机内存、持久内存和托管堆内存)上进行操作的方法,并且随着时间的推移,可以适应其他平台(例如,32 位 x86)和用其他语言编写的外部函数优于 C(例如 C++、Fortran)。
    • 安全- 允许程序对外部内存执行不安全的操作,但默认情况下会警告用户此类操作。

JEP 448:Vector API(第六个孵化器)

  • JEP 目标:
    • 引入了一个 API 来表达向量计算,该计算可以在运行时可靠地编译为支持的 CPU 架构上的最佳向量指令,从而实现优于同等标量计算的性能。
    • 其中包括以下显着变化:
      • 将异或 (xor) 运算添加到向量掩码。
      • 提高向量洗牌的性能,特别是在用于重新排列向量的元素以及在向量之间进行转换时。
  • 相关:
    • [JDK 16] JEP 338:矢量 API(孵化器)
    • [JDK 17] JEP 414:Vector API(第二个孵化器)
    • [JDK 18] JEP 417:Vector API(第三个孵化器)
    • [JDK 19] JEP 426:Vector API(第四个孵化器)
    • [JDK 20] JEP 438:Vector API(第五个孵化器)
  • 价值:
    • 提供清晰简洁的 API,能够清晰简洁地表达各种向量计算,这些向量计算由循环内组成的向量运算序列组成,并可能带有控制流
    • API 应该与 CPU 架构无关,从而能够在支持向量指令的多种架构上实现。
    • 在 x64 和 AArch64 架构上提供可靠的运行时编译和性能。
    • Valhalla 计划保持一致。

核心库

JEP 431:排序集合

  • JEP 目标:
    • 引入新接口来表示具有定义的遭遇顺序的集合。每个这样的集合都有一个明确定义的第一个元素、第二个元素,依此类推,直到最后一个元素。
    • 提供统一的 API,用于访问其第一个和最后一个元素,以及按相反顺序处理其元素。
  • 价值:
    • 通过提供一组统一的操作来提高开发人员的工作效率,这些操作适用于代表具有定义的遇到顺序的元素序列的集合类型。

性能更新

JEP 439:世代 ZGC

  • JEP 目标:
  • 价值:
    • 使用 Generational ZGC 运行的应用程序应该享受:
      • 降低分配停滞的风险。
      • 降低所需的堆内存开销。
      • 降低垃圾收集 CPU 开销。
    • 与非分代 ZGC 相比,这些好处应该不会显着降低吞吐量。应保留非代 ZGC 的基本属性:
    • 暂停时间不应超过 1 毫秒。
    • 应支持从几百兆字节到数 TB 的堆大小。
    • 应该需要最少的手动配置。

JEP 452:密钥封装机制 API

维护和弃用

JEP 449:弃用 32 位 x86 端口以进行删除

  • JEP 目标:
    • 弃用 Windows 32 位 x86 端口,并打算在未来版本中将其删除。
  • 价值:
    • 更新构建系统,以在尝试配置 Windows 32 位 x86 (x86-32) 的构建时发出错误消息。通过新的配置选项可以抑制错误消息。
    • 将端口和相关端口特定功能标记为已弃用并在相关文档中删除。

JEP 451:准备禁止动态加载代理

  • JEP 目标:
    • 当代理动态加载到正在运行的 JVM 中时发出警告。这些警告旨在帮助用户为将来的版本做好准备,该版本默认情况下不允许动态加载代理,以提高默认情况下的完整性。在启动时加载代理的可服务性工具不会导致在任何版本中发出警告。
  • 价值:
    • 为 JDK 的未来版本做准备,默认情况下,该版本将禁止将代理加载到正在运行的 JVM 中。
    • 重新评估可服务性(涉及对运行代码的临时更改)和完整性(假设运行代码不会被任意更改)之间的平衡。
    • 确保大多数不需要动态加载代理的工具不受影响。
    • 将动态加载代理的能力与其他所谓的“超级”功能(例如深度反射)结合起来。

资源

Java 仍然是当今技术趋势的第一大编程语言。 Java 21 的按时交付改进表明,通过持续深思熟虑的规划和生态系统参与,Java 平台已为云中的现代开发和增长做好了准备。

通过以下方式继续了解最新新闻和更新:

  • 访问 Dev.java(Oracle 的专用门户,旨在提高您的 Java 知识和社区参与度)。
  • 访问 Inside.java (Oracle Java 团队的新闻和观点)。
  • 收听Inside.java 播客(由 Oracle 的 Java 开发人员直接为您提供的面向 Java 开发人员的音频节目。对话将讨论该语言、JVM、OpenJDK、平台安全性、Loom 和 Panan 等创新项目以及一切之间)。
  • 观看 Inside.java 新闻广播(将 Inside.java 播客扩展为视频格式的视频节目)。
  • 在 YouTube 上观看Java (Oracle 的相关 Java 视频集合,可帮助您提高 Java 专业知识)。
  • 观看JEP Café (Oracle 对流行的 JDK 增强提案的技术探索)。
  • 观看Sip of Java(Oracle 的 1 分钟简短视频,介绍了鲜为人知的 Java 增强功能,这些增强功能可提供性能、稳定性和安全性改进)。
  • 加入OpenJDK 邮件列表(了解您最喜欢的 OpenJDK 项目进展的地方)。
  • 在 Twitter 上关注OpenJDKJava(社交媒体提供有关 Java 不断发展的更新和新闻)。

萨拉特·钱德

Java SE 产品管理总监

Sharat Chander 在 IT 行业工作了 20 年,曾就职于 Bell Atlantic、Verizon、Sun Microsystems 和 Oracle 等公司。他的背景和技术专长是 Java 开发工具、图形设计和产品/社区管理。 Chander 15 年来一直积极参与 Java 社区,帮助提高 Java 意识、接受度、采用和宣传。在 Oracle,作为 Java 开发人员关系总监,Chander 担任 JavaOne 会议内容主席,他担任该职位已有 7 年,负责推动会议中的技术内容策略和 Java 社区参与。他经常担任全球开发者计划的主题演讲者和参与者。 Chander 拥有马里兰大学企业金融学士学位和马里兰州洛约拉学院国际商务 MBA 学位。您可以在多个全球开发者活动和 Java 社区活动中找到 Chander。当爪哇的知名度不高时,他会追随他对棒球的其他热情,并狂热地追随他的家乡巴尔的摩金莺队。

推特账号:@Sharat_Chander

显示较少

上一篇文章

宣布推出适用于 JDK 21 的 Oracle GraalVM

肖恩·史密斯| 4分钟阅读

下一篇文章


GraalOS 简介

肖恩·史密斯| 2分钟阅读